/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.jm.acionista.view;

import br.jm.acionista.base.eao.EaoException;
import br.jm.acionista.entity.Anotacao;
import br.jm.acionista.entity.Averbacao;
import br.jm.acionista.entity.Cliente;
import br.jm.acionista.entity.Livro;
import br.jm.acionista.filter.Funcoes;
import br.jm.acionista.sistema.eao.AverbacaoEao;
import br.jm.acionista.sistema.eao.ClienteEao;
import br.jm.acionista.sistema.eao.LivroEao;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import org.primefaces.event.SelectEvent;
import org.primefaces.model.LazyDataModel;

/**
 *
 * @author joao
 */
public class AverbacaoBean implements Serializable {

    private static final long serialVersionUID = 1L;
    private Averbacao selectedAverbacao;
    private LazyDataModel<Averbacao> lazyModel;
    private AverbacaoEao averbacaoJpa;
    private ClienteEao clienteJpa;
    private LivroEao livroJpa;
    private Funcoes funcoes = new Funcoes();
    private Anotacao selectedAnotacao;
    private Cliente SelectedCliente;
    private Livro selectedLivro;
    private boolean disable;
    private String cSql;

    public AverbacaoBean() {
        averbacaoJpa = AverbacaoEao.getInstance();
        clienteJpa = ClienteEao.getInstance();
        livroJpa = LivroEao.getInstance();

        selectedAnotacao = new Anotacao();
        SelectedCliente = new Cliente();
        selectedLivro = new Livro();
        selectedAverbacao = novo();
        
        disable = true;

        try {
            this.lazyModel = new LazyDataModel<Averbacao>() {

                @Override
                public List<Averbacao> load(int first, int pageSize, String sortField, boolean sortOrder, Map<String, String> filters) {
                    List<Averbacao> data = new ArrayList<Averbacao>();

                    if (selectedAverbacao.getIdCliente().getIdCliente() != null) {
                        filters.put("idCliente", selectedAverbacao.getIdCliente().getIdCliente().toString());
                    } else {
                        filters.put("idCliente", "0");
                    }
                    try {
                        data = averbacaoJpa.getNative("Averbacao", first, pageSize, sortField, sortOrder, filters, null);
                        this.setPageSize(pageSize);
                    } catch (Exception ex) {
                        Logger.getLogger(AverbacaoBean.class.getName()).log(Level.SEVERE, null, ex);
                    }

                    return data;
                }
            };
            this.lazyModel.setRowCount(averbacaoJpa.getCount("Averbacao"));


        } catch (Exception ex) {
            Logger.getLogger(AverbacaoBean.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public void inserir(ActionEvent actionEvent) {
        FacesMessage msg = null;

        try {
            selectedAverbacao.setIdAverbacao(null);
            carregaDados();
            averbacaoJpa.create(selectedAverbacao);

            msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Averbacao Inserido com Sucesso", "");

        } catch (Exception e) {
            msg = new FacesMessage(FacesMessage.SEVERITY_WARN, "Erro ao Inserir", e.getMessage());
        } finally {
            //atualizaAverbacao();
            FacesContext.getCurrentInstance().addMessage(null, msg);
        }
    }

    public void alterar(ActionEvent actionEvent) {
        FacesMessage msg = null;

        try {
            averbacaoJpa.edit(selectedAverbacao);
            msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Averbacao Alterado com Sucesso", "");
        } catch (Exception e) {
            msg = new FacesMessage(FacesMessage.SEVERITY_WARN, "Erro ao Alterar: ", e.getMessage());
        } finally {
            //atualizaAverbacao();
            FacesContext.getCurrentInstance().addMessage(null, msg);
        }
    }

    public void excluir(ActionEvent actionEvent) {
        FacesMessage msg = null;

        try {
            averbacaoJpa.destroy(selectedAverbacao);

            msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Averbacao Excluido com Sucesso", "");
        } catch (Exception e) {
            msg = new FacesMessage(FacesMessage.SEVERITY_WARN, "Erro ao Excluir: ", e.getMessage());
        } finally {
            //atualizaAverbacao();
            FacesContext.getCurrentInstance().addMessage(null, msg);
        }
    }

    public Averbacao novo() {
        selectedAnotacao = new Anotacao();
        SelectedCliente = new Cliente();
        selectedLivro = new Livro();

        this.disable = false;
        
        this.selectedAverbacao = new Averbacao();
        this.selectedAverbacao.setDatAverbacao(new Date());
        this.selectedAverbacao.setIdAnotacao(selectedAnotacao);
        this.selectedAverbacao.setIdCliente(SelectedCliente);
        this.selectedAverbacao.setIdLivro(selectedLivro.getIdLivro());
        this.selectedAverbacao.setQdeAlienacao(BigDecimal.ZERO);
        this.selectedAverbacao.setQdeJudicial(BigDecimal.ZERO);
        this.selectedAverbacao.setQdePenhor(BigDecimal.ZERO);
        this.selectedAverbacao.setQdePortador(BigDecimal.ZERO);

        return this.selectedAverbacao;
    }

    public LazyDataModel<Averbacao> getLazyModel() {
        return lazyModel;
    }

    public void setLazyModel(LazyDataModel<Averbacao> lazyModel) {
        this.lazyModel = lazyModel;
    }

    public Averbacao getSelectedAverbacao() {
        if (this.selectedAverbacao == null) {
            this.selectedAverbacao = novo();
        }
        return selectedAverbacao;
    }

    public void setSelectedAverbacao(Averbacao selectedAverbacao) {
        if (selectedAverbacao.getIdLivro() != null) {
            try {
                selectedLivro = livroJpa.getPorId(selectedAverbacao.getIdLivro());
            } catch (EaoException ex) {
                Logger.getLogger(AverbacaoBean.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
        this.selectedAverbacao = selectedAverbacao;
    }

    public void onSelectRow(SelectEvent event) throws EaoException {
        FacesContext facesContext = FacesContext.getCurrentInstance();
        Map<String, String> map = facesContext.getExternalContext().getRequestParameterMap();

        int nIdCliente = Integer.parseInt(map.get("idCliente"));
        Cliente clienteTemp = clienteJpa.getPorId(nIdCliente);

        selectedAnotacao = new Anotacao();
        selectedAnotacao = (Anotacao) event.getObject();

        if (this.selectedAverbacao == null) {
            this.selectedAverbacao = novo();
        }

        this.selectedAverbacao.setIdAnotacao(selectedAnotacao);
        this.selectedAverbacao.setIdCliente(clienteTemp);

        this.selectedAverbacao.setIdAnotacao(selectedAnotacao);
    }

    public void onSelectRowCliente(SelectEvent event) throws EaoException {
        this.disable = true;
        
        this.selectedAverbacao = novo();
        
        this.SelectedCliente = (Cliente) event.getObject();

        this.selectedAverbacao.setIdCliente(this.SelectedCliente);
    }

    public void onSelectRowLivro(SelectEvent event) throws EaoException {
        if (selectedLivro == null || selectedLivro.getIdLivro() == null) {
            selectedLivro = new Livro();
        }
        selectedLivro = (Livro) event.getObject();
        this.selectedAverbacao.setIdLivro(selectedLivro.getIdLivro());
    }

    public void carregaDados() throws EaoException {
        FacesContext facesContext = FacesContext.getCurrentInstance();
        Map<String, String> map = facesContext.getExternalContext().getRequestParameterMap();

        String cDatAverbacao = map.get("inDatAverbacao_input");
        String cqdePortador = map.get("qdePortador");
        //String cqdeJudicial = map.get("qdeJudicial");
        String cqdePenhor = map.get("qdePenhor");
        String cqdeAlienacao = map.get("qdeAlienacao");

        this.selectedAverbacao.setDatAverbacao(funcoes.ConverteData(cDatAverbacao));
        this.selectedAverbacao.setQdePortador(funcoes.criaBigDecimal(cqdePortador));
        this.selectedAverbacao.setQdeJudicial(BigDecimal.ZERO);
        this.selectedAverbacao.setQdePenhor(funcoes.criaBigDecimal(cqdePenhor));
        this.selectedAverbacao.setQdeAlienacao(funcoes.criaBigDecimal(cqdeAlienacao));
        
        cSql = "select id_livro,dat_abertura,dat_fechamento,num_folha_final,num_folha_inic,num_livro "
                + "from livro "
                + "where dat_fechamento is null";
        this.selectedLivro = livroJpa.getNativeFiltro(cSql);
        this.selectedAverbacao.setIdLivro(selectedLivro.getIdLivro());

    }

    public Anotacao getSelectedAnotacao() {
        return selectedAnotacao;
    }

    public void setSelectedAnotacao(Anotacao selectedAnotacao) {
        this.selectedAnotacao = selectedAnotacao;
    }

    public Cliente getSelectedCliente() {
        return SelectedCliente;
    }

    public void setSelectedCliente(Cliente SelectedCliente) {
        this.SelectedCliente = SelectedCliente;
    }

    public Livro getSelectedLivro() {
        return selectedLivro;
    }

    public void setSelectedLivro(Livro selectedLivro) {
        this.selectedLivro = selectedLivro;
    }

    public boolean isDisable() {
        return disable;
    }

    public void setDisable(boolean disable) {
        this.disable = disable;
    }
    
}
